package watcher

import (
	"io"
	"os"
	"sync/atomic"
	"time"
)

// loadFile 加载文件并移动到偏移量位置
func (w *FileWatcher) loadFile(filePath string, offset int64) (*os.File, error) {
	file, err := os.Open(filePath)
	if err != nil {
		return nil, err
	}

	// 将文件指针移动到偏移量位置
	_, err = file.Seek(offset, io.SeekStart)
	if err != nil {
		file.Close()
		return nil, err
	}
	return file, nil

}

// readNewLines 读取并输出文件的新行
func (w *FileWatcher) readNewLines(show ...bool) {
	w.mu.Lock()
	defer w.mu.Unlock()
	count := 0
	for {
		if atomic.LoadInt32(&w.done) == 1 {
			return
		}
		// 读取一行

		line, err := w.reader.ReadString('\n')
		if err != nil {
			if err == io.EOF {
				break
			}
			w.log.Errorf("读取行时出错: %v", err)
			break
		}
		count++

		// 更新偏移量
		atomic.AddInt64(&w.lineCount, 1)
		offset, err := w.file.Seek(0, io.SeekCurrent)
		if err != nil {
			w.log.Errorf("更新偏移量时出错: %v", err)
			continue
		}
		w.offset = offset

		// 将新行发送到通道
		if line != "" {
			select {
			case w.linesChan <- line:
			default:
				// w.log.Warn("丢弃数据:", line)
			}
		}
	}
	// if count > 0 && types.GetBoolByIndex(show, 0) {
	// 	w.log.Infof("读取到:%d行数据", count)
	// }
}

// readExistingLines 读取文件从偏移量到当前的内容，并输出新行
func (w *FileWatcher) readExistingLines() {
	// 如果文件指针已经在文件末尾，则不需要读取
	fileInfo, err := w.file.Stat()
	if err != nil {
		w.log.Errorf("获取文件信息时出错: %v", err)
		return
	}

	// 读取从偏移量到文件末尾的内容
	_, err = w.file.Seek(w.offset, io.SeekStart)
	if err != nil {
		w.log.Errorf("将文件指针移动到偏移量位置时出错: %v", err)
		return
	}
	start := time.Now()
	w.log.Info("读取文件：", w.filePath, convertBytes(fileInfo.Size()))
	lastOffset := w.offset
	w.readNewLines() // 读取并处理新行
	currentLine := atomic.LoadInt64(&w.lineCount)
	w.log.Infof("从%d开始 读取了%d行, %s %v", lastOffset, currentLine, convertBytes(fileInfo.Size()), time.Since(start))
}
